前言
FreeRTOS(Real-Time Operating System)是一个开源的实时操作系统内核,专注于嵌入式系统。它提供了一套用于管理任务、调度器、内存管理等的实时操作系统功能,为嵌入式应用程序提供了强大的任务管理和资源管理能力。 CubeMX集成了许多中间件和库,包括FreeRTOS。通过简单的选择,用户可以轻松地启用和配置FreeRTOS,而不需要手动整合和调整。
一、Freertos可视化配置
配置外部高速时钟
根据芯片手册配置外部晶振,使用外部晶振作为系统时钟源,频率更准确
配置FreeRTOS
生成.c和.h文件对
生成代码时出现警告,原因是FreeRTOS将systick作为时钟源,因此需要设置另外一个定时器作为HAL库的时钟源
动态创建两个任务
一些基本参数的设置
二、生成代码
项目代码框架介绍
生成的创建进程的代码
const osThreadAttr_t Task_LED0_attributes = { .name = "Task_LED0", .priority = (osPriority_t) osPriorityNormal, .stack_size = 128 * 4 }; /* Definitions for Task_LED1 */ osThreadId_t Task_LED1Handle; const osThreadAttr_t Task_LED1_attributes = { .name = "Task_LED1", .priority = (osPriority_t) osPriorityNormal, .stack_size = 128 * 4 };c运行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
void MX_FREERTOS_Init(void) { /* creation of Task_LED0 */ Task_LED0Handle = osThreadNew(AppTask_LED0, NULL, &Task_LED0_attributes); /* creation of Task_LED1 */ Task_LED1Handle = osThreadNew(AppTask_LED1, NULL, &Task_LED1_attributes); }c运行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
在任务函数中实现让两个LED灯分别每隔500ms和1s进行亮灭的反转
/* USER CODE END Header_AppTask_LED0 */ void AppTask_LED0(void *argument) { /* USER CODE BEGIN AppTask_LED0 */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); HAL_Delay(500); } /* USER CODE END AppTask_LED0 */ } /* USER CODE BEGIN Header_AppTask_LED1 */ /** * @brief Function implementing the Task_LED1 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_AppTask_LED1 */ void AppTask_LED1(void *argument) { /* USER CODE BEGIN AppTask_LED1 */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); HAL_Delay(1000); } /* USER CODE END AppTask_LED1 */ }c运行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
三、实验现象
具有相同优先级时,利用时间片调度算法,每个任务都能得到CPU的使用权。LED0和LED1轮流执行,LED0和LED1实现不同频率的闪烁。